/**
 * 回调函数：获取异步操作的结果
 * 数据操作文件模块
 * 职责：
 *    操作文件中的数据，只处理数据，不关心业务
 */
var fs = require('fs');

var dbPath = './database.json';
// 获取所有的学生列表
exports.findAll = function (callback) {
	// fs.readFile 方法是异步的，要获取结果必须通过回调函数
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}
		// 从文件读取的数据是字符串，要转成对象
		callback(null, JSON.parse(data).students);
	});
};

//根据id查找单个学生
exports.find = function (id, callback) {
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}
		// 从文件读取的数据是字符串，要转成对象
		var students = JSON.parse(data).students;
		var student = students.find((item) => {
			return item.id === parseInt(id);
		});
		callback(null, student);
	});
};

//添加保存学生
exports.save = function (student, callback) {
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}

		var students = JSON.parse(data).students;
		//处理 id 唯一，不重复
		student.id = students[students.length - 1].id + 1;
		students.push(student);
		// students是一个数组，外面要包裹一层对象
		let fileData = JSON.stringify({ students });
		fs.writeFile(dbPath, fileData, function (err) {
			if (err) {
				return callback(err);
			}
			//成功就是没出错，所以错误对象是 null
			callback(null);
		});
	});
};

//更新学生
exports.update = function (student, callback) {
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}

		//注意：这里要把提交的 id 字符串转换成数字
		student.id = parseInt(student.id);
		var students = JSON.parse(data).students;
		var stu = students.find(function (item) {
			return item.id === student.id;
		});
		// Object.assign(stu, student);//浅拷贝可以使用
		for (const key in student) {
			stu[key] = student[key];
		}
		// students是一个数组，外面要包裹一层对象
		let fileData = JSON.stringify({ students });
		fs.writeFile(dbPath, fileData, function (err) {
			if (err) {
				return callback(err);
			}
			//成功就是没出错，所以错误对象是 null
			callback(null);
		});
	});
};

// 删除学生
exports.delete = function (id, callback) {
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err);
		}
		// 从文件读取的数据是字符串，要转成对象
		var students = JSON.parse(data).students;
		var stuIndex = students.findIndex((item) => {
			return item.id === parseInt(id);
		});
		students.splice(stuIndex, 1);
		let fileData = JSON.stringify({ students });
		fs.writeFile(dbPath, fileData, function (err) {
			if (err) {
				return callback(err);
			}
			//成功就是没出错，所以错误对象是 null
			callback(null);
		});
	});
};
